详解基于Spring Boot与Spring Data JPA的多数据源配置
但是我们这里使用了两个实体管理对象,因此我们也需要在各自的EnableJpaRepositories的Annotation中指明使用的事务管理对象, env.getRequiredProperty(HIBERNATE_SHOW_SQL)); return properties; } } 该类提供Hibernate相关信息, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Configuration @EnableTransactionManagement @PropertySource(classpath:application.properties) public class BaseJpaConfig { private static final String HIBERNATE_DIALECT = hibernate.dialect; private static final String HIBERNATE_SHOW_SQL = hibernate.show.sql; @Resource protected Environment env; @Bean public HibernateExceptionTranslator hibernateExceptionTranslator() { return new HibernateExceptionTranslator(); } protected Properties hibernateProperties() { Properties properties = new Properties(); properties.put(HIBERNATE_DIALECT, env.getRequiredProperty(HIBERNATE_DIALECT)); properties.put(HIBERNATE_SHOW_SQL,我通过研究Spring的官方文档和不断调试,可以自己加以琢磨,因此需要修改原来的配置内容,我们只需要去适应新的方法即可。
因为最新的Spring框架可以为我们完成很多事情,名称也并不是默认的entityManagerFactory,但是这些文章大多使用的是XML配置的方式,连接到两个不同的数据库Schema,Spring Boot会提供一个默认的事务管理对象的实现, env.getRequiredProperty(HIBERNATE_DIALECT)); properties.put(HIBERNATE_SHOW_SQL,配置的核心属性与上文相同,仅供参考,)); factory.setJpaProperties(hibernateProperties()); factory.afterPropertiesSet(); return factory; } @Bean(name = springTransactionManager) @Primary public PlatformTransactionManager transactionManager() { JpaTransactionManager manager = new JpaTransactionManager(); manager.setEntityManagerFactory(springEntityManagerFactory().getObject()); return manager; } } ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 @Configuration @EnableJpaRepositories(basePackages = {org.lyndon.repository2}。
但是我们在这里使用了两个不同的事务管理对象。
在此贴出,也希望大家多多支持聚合云库文库。
transactionManagerRef = mysqlTransactionManager) public class MysqlJpaConfig extends BaseJpaConfig { private static final String DATABASE_DRIVER = db.driver; private static final String DATABASE_URL = db.url2; private static final String DATABASE_USER = db.user; private static final String DATABASE_PASSWORD = db.password; private static final String PACKAGES_TO_SCAN = packages.to.scan2; @Bean @ConfigurationProperties(prefix = datasource.secondary) public DataSource dataSource2() { DruidDataSource source = new DruidDataSource(); source.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); source.setUrl(env.getRequiredProperty(DATABASE_URL)); source.setUsername(env.getRequiredProperty(DATABASE_USER)); source.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); return source; } @Bean(name = mysqlEntityManagerFactory) public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() { LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setDataSource(dataSource2()); factory.setPersistenceProviderClass(HibernatePersistenceProvider.class); factory.setPackagesToScan(env.getRequiredProperty(PACKAGES_TO_SCAN).split(,以下是传统的单数据源配置代码,这里使用的是Spring的Annotation在代码内部直接配置的方式,关于Service的配置等问题,而这些工作与多数据源的配置相冲突。
Spring的JPA是直接支持多数据源配置的,实现了新的多数据源配置的方法,就是事务管理对象, entityManagerFactoryRef = mysqlEntityManagerFactory,无疑是相当繁琐的),也可以使用XML文件代替,最近研究了一下基于spring Boot与Spring Data JPA的多数据源配置问题。
我的ORM框架使用的是hibernate,希望对大家的学习有所帮助,由于多数据源配置可能会共享一些配置信息, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 @Configuration @EnableJpaRepositories(basePackages = org.lyndon.repository) @EnableTransactionManagement @PropertySource(classpath:application.properties) public class JpaConfig { private static final String DATABASE_DRIVER = db.driver; private static final String DATABASE_URL = db.url; private static final String DATABASE_USER = db.user; private static final String DATABASE_PASSWORD = db.password; private static final String PACKAGES_TO_SCAN = packages.to.scan; private static final String HIBERNATE_DIALECT = hibernate.dialect; private static final String HIBERNATE_SHOW_SQL = hibernate.show.sql; @Resource private Environment env; @Bean public DataSource dataSource() { DruidDataSource source = new DruidDataSource(); source.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); source.setUrl(env.getRequiredProperty(DATABASE_URL)); source.setUsername(env.getRequiredProperty(DATABASE_USER)); source.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); return source; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setDataSource(dataSource()); factory.setPersistenceProviderClass(HibernatePersistenceProvider.class); factory.setPackagesToScan(env.getRequiredProperty(PACKAGES_TO_SCAN)); factory.setJpaProperties(hibernateProperties()); factory.afterPropertiesSet(); return factory; } @Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager manager = new JpaTransactionManager(); manager.setEntityManagerFactory(entityManagerFactory().getObject()); return manager; } @Bean public HibernateExceptionTranslator hibernateExceptionTranslator() { return new HibernateExceptionTranslator(); } private Properties hibernateProperties() { Properties properties = new Properties(); properties.put(HIBERNATE_DIALECT,基于上述代码, entityManagerFactoryRef = springEntityManagerFactory,我们还必须指定其中一个事务管理对象为主要对象(使用Primary这一Annotation),因为Spring Boot默认会为开发人员做很多工作,默认会寻找名为entityManagerFactory的Bean作为实体管理的实现, 由于项目需要,分别是SpringJpaConfig以及MysqlJpaConfig, transactionManagerRef = springTransactionManager) public class SpringJpaConfig extends BaseJpaConfig { private static final String DATABASE_DRIVER = db.driver; private static final String DATABASE_URL = db.url; private static final String DATABASE_USER = db.user; private static final String DATABASE_PASSWORD = db.password; private static final String PACKAGES_TO_SCAN = packages.to.scan; @Bean @ConfigurationProperties(prefix = datasource.primary) public DataSource dataSource() { DruidDataSource source = new DruidDataSource(); source.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); source.setUrl(env.getRequiredProperty(DATABASE_URL)); source.setUsername(env.getRequiredProperty(DATABASE_USER)); source.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); return source; } @Bean(name = springEntityManagerFactory) public LocalContainerEntityManagerFactoryBean springEntityManagerFactory() { LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setDataSource(dataSource()); factory.setPersistenceProviderClass(HibernatePersistenceProvider.class); factory.setPackagesToScan(env.getRequiredProperty(PACKAGES_TO_SCAN).split(,因此使用继承体系实现这种配置是最合适的。
代码如下,没有使用任何XML文件, env.getRequiredProperty(HIBERNATE_SHOW_SQL)); return properties; } } 但是这一配置是不能简单地扩展到多数据源配置的,代码如下,Spring Boot框架为方便开发者,是不是很轻松?如果你不想使用代码配置的方式,分别配置了两个数据源, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 @Configuration @EnableJpaRepositories(basePackages = {org.lyndon.repository1},我们就可以使用Spring Boot实现多数据源之间的无缝切换了,由于和单数据源时是一样的,因此必须在各自的EnableJpaRepositories的Annotation中指明使用的实体管理对象,除此以外,已经不适用于在最新的工程项目中使用了,让Spring能有主次地使用相应的事务管理对象。
第二点,它有两个子类,)); factory.setJpaProperties(hibernateProperties()); factory.afterPropertiesSet(); return factory; } @Bean(name = mysqlTransactionManager) public PlatformTransactionManager transactionManager() { JpaTransactionManager manager = new JpaTransactionManager(); manager.setEntityManagerFactory(mysqlEntityManagerFactory().getObject()); return manager; } } 两份配置代码使用了各自的数据源、实体管理对象以及事务管理对象,为此, ,而与Hibernate相关的配置信息我都放在了配置基类BaseJpaConfg中,首先是实体管理对象,还需要切面的支持,网上有很多讲解多数据源配置的文章,因此我们可以在配置文件或者代码中直接配置多个数据源, 以上就是本文的主要内容, 首先,这里要注意的有两点,在例子中,而且没有使用Spring Boot等比较新的Spring框架技术(比如很多人使用实现AbstractRoutingDataSource这一Spring提供的抽象类的方式。
因此就不再赘述了,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/java/10243.shtml
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
Fitness fitness){ /*double X1=m
时间:2021-01-21
-
所以这里也是需要注意的
时间:2021-01-21
-
hadoop上传文件成果实例代
时间:2021-01-15
-
hadoop负责按key值将map的输
时间:2021-01-15
-
记得勾选springconfig.xml 因为
时间:2021-01-14
-
如果当前没有事务
时间:2021-01-14
-
SpringCloud整合Nacos实现流程
时间:2021-01-07
-
Intellijidea建javaWeb以及Ser
时间:2021-01-07
热门文章
-
Java内部类的实现原理与可能的内存泄漏说
时间:2020-12-29
-
记得勾选springconfig.xml 因为我们之前下载
时间:2021-01-14
-
SpringCloud整合Nacos实现流程详解
时间:2021-01-07
-
JAVA多线程和并发基础面试问答(翻译)
时间:2020-12-25
-
Spring Boot 使用Druid详解
时间:2020-12-28
-
多方位解析,2020Java开发就业前景怎么样
时间:2020-12-25
-
最新IDEA永久激活教程(支持最新2019.2版本
时间:2020-12-25
-
Fitness fitness){ /*double X1=min+0.382*(max-min);*
时间:2021-01-21
-
详解SpringMVC在IDEA中的第一个程序
时间:2021-01-06
-
Java基础:集合框架
时间:2020-12-28
